home *** CD-ROM | disk | FTP | other *** search
/ Aminet 34 / Aminet 34 (2000)(Schatztruhe)[!][Dec 1999].iso / Aminet / util / misc / dial.lha / Dial / source / dialtone.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-03-24  |  10.4 KB  |  321 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <devices/audio.h>
  4. #include <graphics/gfxbase.h>
  5.  
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <exec/libraries.h>
  10. #include <libraries/mui.h>
  11. #include <hardware/custom.h>
  12. #include <exec/memory.h>
  13.  
  14. #include <clib/alib_protos.h>
  15. #include <clib/exec_protos.h>
  16. #include <proto/muimaster.h>
  17.  
  18. #include "GUI.h"
  19.  
  20.  
  21. struct IOAudio *AudioIO=0;                /* Pointer to the I/O block for I/O commands */
  22. struct IOAudio *AudioIO2=0;               /* Pointer to the I/O block for I/O commands */
  23. struct MsgPort *AudioMP=0;                /* Pointer to a port so the device can reply */
  24. struct MsgPort *AudioMP2=0;               /* Pointer to a port so the device can reply */
  25. struct Message *AudioMSG=0;               /* Pointer for the reply message */
  26. struct Message *AudioMSG2=0;              /* Pointer for the reply message */
  27.  
  28. LONG            clock     = 3579545;    /* Clock constant, 3546895 for PAL */
  29. LONG            samples   = 16;         /* Number of sample bytes */
  30. LONG            samcyc    = 1;          /* Number of cycles in the sample */
  31. ULONG           device;
  32. ULONG           device2;
  33. ULONG           devicet;
  34.  
  35. BYTE *waveptr = 0;                          /* pointer to sine wave in chip mem */
  36.  
  37.  
  38. /* extern struct Custom custom; */
  39.  
  40. /* /// "sinewave"  */
  41. BYTE sinewave[16] = {
  42.     0,45,
  43.     90,115,
  44.     127,115,
  45.     90,45,
  46.     0,-45,
  47.     -90,-115,
  48.     -127,-115,
  49.     -90,-45
  50. };
  51.  
  52. /* /// */
  53.  
  54. /* /// "OpenAudio"  */
  55. int OpenAudio(LONG volume)
  56. {
  57.     struct GfxBase *GfxBase;
  58.  
  59.     UBYTE           whichannel[1];
  60.     UBYTE           whichannel2[1];
  61.  
  62.     if (volume<0)
  63.     {
  64.         whichannel[0]  = 1;        /* left channels */
  65.         whichannel2[0] = 8;
  66.     }
  67.     else
  68.     {
  69.         whichannel[0]  = 2;        /* right channels */
  70.         whichannel2[0] = 4;
  71.     }
  72.  
  73.     if (volume<0) volume*=-1;
  74.  
  75. /*-------------------------------------------------------------------------*/
  76. /* Ask the system if we are PAL or NTSC and set clock constant accordingly */
  77. /*-------------------------------------------------------------------------*/
  78.  
  79.     GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
  80.     if (GfxBase == NULL) return FALSE;
  81.  
  82.     if (GfxBase->DisplayFlags & PAL)
  83.         clock = 3546895;                /* PAL clock */
  84.     else
  85.         clock = 3579545;                /* NTSC clock */
  86.  
  87.     if (GfxBase) CloseLibrary((struct Library *) GfxBase);
  88.  
  89.     waveptr=AllocVec(samples,MEMF_CHIP);
  90.     if (!waveptr) return FALSE;
  91.     CopyMem(sinewave,waveptr,samples);
  92.  
  93.         /* --- 1. Kanal allozieren ---------------------  */
  94.  
  95.     AudioIO = (struct IOAudio *)AllocVec( sizeof(struct IOAudio),MEMF_PUBLIC | MEMF_CLEAR);
  96.     if (AudioIO == 0) return FALSE;
  97.  
  98.     AudioMP = CreatePort(0,0);
  99.     if (AudioMP == 0) return FALSE;
  100.  
  101.     AudioIO->ioa_Request.io_Message.mn_ReplyPort   = AudioMP;
  102.     AudioIO->ioa_Request.io_Message.mn_Node.ln_Pri = 127;
  103.     AudioIO->ioa_Request.io_Command                = ADCMD_ALLOCATE;
  104.     AudioIO->ioa_Request.io_Flags                  = ADIOF_NOWAIT;
  105.     AudioIO->ioa_AllocKey                          = 0;
  106.     AudioIO->ioa_Data                              = whichannel;
  107.     AudioIO->ioa_Length                            = sizeof(whichannel);
  108.  
  109.     device = OpenDevice("audio.device",0L, (struct IORequest *) AudioIO ,0L);
  110.     if (device != 0) return FALSE;
  111.  
  112.     AudioIO->ioa_Request.io_Message.mn_ReplyPort =AudioMP;
  113.     AudioIO->ioa_Request.io_Command              =CMD_WRITE;
  114.     AudioIO->ioa_Request.io_Flags                =ADIOF_PERVOL;
  115.     AudioIO->ioa_Data                            =waveptr;
  116.     AudioIO->ioa_Length                          =16;
  117.     AudioIO->ioa_Volume                          =volume;
  118.     AudioIO->ioa_Cycles                          =0;
  119.  
  120.  
  121.         /* --- 2. Kanal allozieren ---------------------  */
  122.  
  123.     AudioIO2 = (struct IOAudio *)AllocVec( sizeof(struct IOAudio),MEMF_PUBLIC | MEMF_CLEAR);
  124.     if (AudioIO2 == 0) return FALSE;
  125.  
  126.     AudioMP2 = CreatePort(0,0);
  127.     if (AudioMP2 == 0) return FALSE;
  128.  
  129.     AudioIO2->ioa_Request.io_Message.mn_ReplyPort   = AudioMP2;
  130.     AudioIO2->ioa_Request.io_Message.mn_Node.ln_Pri = 127;
  131.     AudioIO2->ioa_Request.io_Command                = ADCMD_ALLOCATE;
  132.     AudioIO2->ioa_Request.io_Flags                  = ADIOF_NOWAIT;
  133.     AudioIO2->ioa_AllocKey                          = 0;
  134.     AudioIO2->ioa_Data                              = whichannel2;
  135.     AudioIO2->ioa_Length                            = sizeof(whichannel2);
  136.  
  137.     device2 = OpenDevice("audio.device",0L, (struct IORequest *) AudioIO2 ,0L);
  138.     if (device2 != 0) return FALSE;
  139.  
  140.     AudioIO2->ioa_Request.io_Message.mn_ReplyPort =AudioMP2;
  141.     AudioIO2->ioa_Request.io_Command              =CMD_WRITE;
  142.     AudioIO2->ioa_Request.io_Flags                =ADIOF_PERVOL;
  143.     AudioIO2->ioa_Data                            =waveptr;
  144.     AudioIO2->ioa_Length                          =16;
  145.     AudioIO2->ioa_Volume                          =volume;
  146.     AudioIO2->ioa_Cycles                          =0;
  147.  
  148.     return TRUE;
  149. }
  150. /* /// */
  151.  
  152. /* /// "DualTone"  */
  153. int DualTone(char digit, ULONG delay)
  154. {
  155.     int F1,F2, i=0;
  156.  
  157.     switch (digit)
  158.     {
  159.       case '0' :                                        F1=1336; F2=941;  break;
  160.       case '1' :                                        F1=1209; F2=697;  break;
  161.       case '2' : case 'A':case 'B':case 'C':            F1=1336; F2=697;  break;
  162.       case '3' : case 'D':case 'E':case 'F':            F1=1477; F2=697;  break;
  163.       case '4' : case 'G':case 'H':case 'I':            F1=1209; F2=770;  break;
  164.       case '5' : case 'J':case 'K':case 'L':            F1=1336; F2=770;  break;
  165.       case '6' : case 'M':case 'N':case 'O':            F1=1477; F2=770;  break;
  166.       case '7' : case 'P':case 'Q':case 'R':case 'S':   F1=1209; F2=852;  break;
  167.       case '8' : case 'T':case 'U':case 'V':            F1=1336; F2=852;  break;
  168.       case '9' : case 'W':case 'X':case 'Y':case 'Z':   F1=1477; F2=852;  break;
  169.       case '*' :                                        F1=1209; F2=941;  break;
  170.       case '#' :                                        F1=1477; F2=941;  break;
  171.     }
  172.  
  173.     if (!AudioIO) return FALSE;
  174.  
  175.     AudioIO->ioa_Period =clock*samcyc/(samples*F1);
  176.     AudioIO2->ioa_Period=clock*samcyc/(samples*F2);
  177.  
  178.     BeginIO((struct IORequest *) AudioIO );
  179.     BeginIO((struct IORequest *) AudioIO2 );
  180.  
  181.         /* TimeDelay sometimes returns an error. try it 50 times */
  182.     while (++i<50 && TimeDelay(UNIT_MICROHZ,0,delay*1000)==-1);
  183.  
  184.     AbortIO((struct IORequest *) AudioIO );
  185.     AbortIO((struct IORequest *) AudioIO2 );
  186. }
  187. /* /// */
  188.  
  189. /* /// "CloseAudio"  */
  190. CloseAudio()
  191. {
  192.     if (device == 0) CloseDevice( (struct IORequest *) AudioIO );
  193.     if (AudioMP) DeletePort(AudioMP);
  194.     if (AudioIO) FreeVec( AudioIO );
  195.  
  196.     if (device2==0) CloseDevice( (struct IORequest *) AudioIO2 );
  197.     if (AudioMP) DeletePort(AudioMP2);
  198.     if (AudioIO) FreeVec( AudioIO2 );
  199.  
  200.     if (waveptr) FreeVec(waveptr);
  201.  
  202.     AudioMP=NULL;
  203.     AudioMP2=NULL;
  204.     AudioIO=NULL;
  205.     AudioIO2=NULL;
  206.     waveptr=NULL;
  207. }
  208. /* /// */
  209.  
  210. /* ///------------------------------ "Dial" ------------------------------  */
  211. void Dial(struct ObjApp *App, char *number, int level)
  212. {
  213.     int i, j;
  214.     char *str=malloc(32);
  215.     char *plusnum=malloc(32);
  216.     LONG WaitDelay;
  217.     LONG PauseDelay;
  218.     LONG ToneDelay;
  219.     LONG b;
  220.  
  221.     if (level==0)
  222.     {
  223.         get(App->SL_AudioLR, MUIA_Slider_Level, &b); /* ask for position of left/right slider */
  224.         if (!OpenAudio(b)) { CloseAudio(); DisplayBeep(NULL); return; }
  225.     }
  226.  
  227.     get(App->SL_Length, MUIA_Slider_Level, &ToneDelay);
  228.     get(App->SL_Pause, MUIA_Slider_Level, &PauseDelay);
  229.     get(App->SL_Wait, MUIA_Slider_Level, &WaitDelay);
  230.     get(App->STR_DialCode, MUIA_String_Contents, &plusnum);
  231.  
  232.     ToneDelay*=10;
  233.     PauseDelay*=10;
  234.     WaitDelay*=10;
  235.  
  236.     get(App->CH_system, MUIA_Selected, &b);
  237.     get(App->STR_system, MUIA_String_Contents, &str);
  238.     if (b && level==0) Dial(App,str,1); /* dial telephone system pre-code */
  239.  
  240.         /* see if 'Conceal ID' checkbox is selected and
  241.            dial *31# to turn off number transmission */
  242.     get(App->CH_Conceal, MUIA_Selected, &b);
  243.     if (b && level==0) Dial(App,"*31#",1);
  244.  
  245.     for (i=0; i<strlen(number); i++)
  246.     {
  247.         j=0;
  248.         if (number[i]=='!')
  249.             while (++j<50 && TimeDelay(UNIT_MICROHZ,0,WaitDelay*1000)==-1); /* TimeDelay sometimes returns an error. try it 50 times */
  250.  
  251.         if (level==0 && number[i]=='+') Dial(App,plusnum,1);
  252.  
  253.         if ( (number[i]>='0' && number[i]<='9') ||
  254.              (number[i]>='A' && number[i]<='Z') ||
  255.              number[i]=='*' || number[i]=='#' )
  256.         {
  257.             j=0;
  258.             DualTone(number[i],ToneDelay);
  259.                 /* TimeDelay sometimes returns an error. try it 50 times */
  260.             while (++j<50 && TimeDelay(UNIT_MICROHZ,0,PauseDelay*1000)==-1);
  261.         }
  262.     }
  263.     free(str);
  264.     free(plusnum);
  265.  
  266.     if (level==0) CloseAudio();
  267. }
  268. /* /// ----------------------------------------------------------------- */
  269.  
  270.  
  271.  
  272. /* /// "old DualTone function with hardware audio"  */
  273. /*
  274. void DualTone(char digit, ULONG delay)
  275. {
  276.     UWORD T1, T2;
  277.     void *SnWave = AllocVec(sizeof(SnWaveData),MEMF_CHIP);
  278.  
  279.     if (!SnWave) return;
  280.  
  281.     CopyMem(SnWaveData,SnWave,sizeof(SnWaveData));
  282.  
  283.     switch (digit)
  284.     {
  285.       case '0' : T1=238; T2=166; break;
  286.       case '1' : T1=319; T2=186; break;
  287.       case '2' :case 'A':case 'B':case 'C':             T1=319; T2=166; break;
  288.       case '3' :case 'D':case 'E':case 'F':             T1=319; T2=151; break;
  289.       case '4' :case 'G':case 'H':case 'I':             T1=290; T2=184; break;
  290.       case '5' :case 'J':case 'K':case 'L':             T1=290; T2=166; break;
  291.       case '6' :case 'M':case 'N':case 'O':             T1=290; T2=151; break;
  292.       case '7' :case 'P':case 'Q':case 'R':case 'S':    T1=263; T2=184; break;
  293.       case '8' :case 'T':case 'U':case 'V':             T1=263; T2=166; break;
  294.       case '9' :case 'W':case 'X':case 'Y':case 'Z':    T1=263; T2=151; break;
  295.       case '*' : T1=238; T2=184; break;
  296.       case '#' : T1=238; T2=151; break;
  297.     }
  298.  
  299.     custom.dmacon=0x000f;
  300.     custom.aud[1].ac_ptr=SnWave;
  301.     custom.aud[2].ac_ptr=SnWave;
  302.     custom.aud[1].ac_len=(UWORD)(sizeof(SnWaveData)/2);
  303.     custom.aud[2].ac_len=(UWORD)(sizeof(SnWaveData)/2);
  304.     custom.aud[1].ac_vol=(UWORD)64;
  305.     custom.aud[2].ac_vol=(UWORD)64;
  306.     custom.aud[1].ac_per=T1;
  307.     custom.aud[2].ac_per=T2;
  308.  
  309.     custom.adkcon=0x00ff;
  310.     custom.dmacon=0x8206;
  311.  
  312.     TimeDelay(UNIT_MICROHZ,0,delay*10000);
  313.  
  314.     custom.dmacon=0x0006;
  315.  
  316.     FreeVec(SnWave);
  317.     }
  318. */
  319. /* /// */
  320.  
  321.